package com.me.study.jdk8.functionInterface;

import org.junit.Assert;
import org.junit.Test;

import java.util.function.Function;

/**
 * JDK 内置的函数式接口--转换型：Function<p>
 *     特点：有输入，有输出
 *
 * @author ME
 * @date   2019/12/17
 */
public class TestFunction {

    private String numberStr = "233";

    @Test
    public void testApply() {
        System.out.println("\ntestApply():");

        // 将String类型转换为Integer类型
        Function<String, Integer> function = str -> Integer.parseInt(str);
        // 方法引用：引用 第一个参数实例的实例方法, 可以更简便
        // Function<String, Integer> function = Integer::parseInt;
        System.out.println(numberStr.getClass().getSimpleName() + " -> " + function.apply(numberStr).getClass().getSimpleName());
    }

    /**
     * 默认方法 andThen():
     * <p>用于两个条件判断 逻辑与</p>
     */
    @Test
    public void testAndThen() {
        // "赵丽颖,32" 解析出年龄, 然后加上100岁
        System.out.println("andThen(): 先计算最后的 apply()，再计算 andThen()");
        System.out.println("\n\"赵丽颖,32\" 解析出年龄, 然后加上100岁");

        String str = "赵丽颖,32";
        Function<String, Integer> function = s -> Integer.parseInt(s.split(",")[1]);
        int age = function.andThen((Integer integer) -> integer + 100).apply(str);
        Assert.assertEquals("赵丽颖 132 岁了", 132, age);
        System.out.println("赵丽颖多少岁? " + age);
    }

    /**
     * 默认方法 compose():
     * <p>用于两个条件判断 逻辑与</p>
     */
    @Test
    public void testCompose() {
        // "赵丽颖,32" 解析出年龄, 然后加上100岁
        System.out.println("\ntestCompose(): 和 andThen()顺序相反, 先执行后面的 Function");

        String str = "没想到业务场景";
        System.out.println(str);
    }
}
